home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / comm / bbs / nim_v0_9.lha / Nim.docs < prev    next >
Encoding:
Text File  |  1994-11-23  |  22.5 KB  |  523 lines

  1.  
  2. --------------------------------------------------------------------------
  3.  
  4.                                      NIM
  5.  
  6.  
  7.  
  8.                         Metro's first two-player game!
  9.  
  10.  
  11.  
  12.                             Written by Peter Deane
  13.  
  14.                        (Inquestor BBS, NSW, Australia)
  15.  
  16. ---------------------------------------------------------------------------
  17.  
  18.  
  19. Details
  20. ~~~~~~~
  21. Version:        0.9
  22. Released:       10 January 1991
  23. Language:       AmigaBASIC
  24. Compiler:       ACBasic Compiler
  25. Options:        A, N, R, T
  26. Stack required: 4,716 bytes
  27.  
  28. Author
  29. ~~~~~~
  30. Peter Francis Deane
  31. PO Box 228
  32. Swansea NSW 2281
  33. AUSTRALIA
  34.  
  35. Fido 3:622/401
  36.  
  37. Sysop of Inquestor BBS - Caves Beach, NSW, Australia
  38.  
  39. 011-61-49-72-1647  (from the United States)
  40.  
  41. (049) 72-1647      (from within Australia)
  42.  
  43. Available 24hrs, all speeds to ZyXEL 19200
  44.  
  45.  
  46. Copyright Status
  47. ~~~~~~~~~~~~~~~~
  48. This program is shareware. ALL rights are reserved by the author,
  49. except that permission is granted to transfer the program electronically,
  50. provided that no profit is made from such a transfer. If a profit IS 
  51. made, then the proceeds must be sent to the author.
  52.  
  53.  
  54. Introduction
  55. ~~~~~~~~~~~~
  56. NIM is a door file to run with the Metro BBS (by Percy L Broadnax).
  57. It is Metro's first two-player game, where users can sign up and compete
  58. with each other. I was thinking of releasing a crippled version, where
  59. players would be limited to two games, and there would be a lower
  60. limit on the number of games playable, but I decided against this. You
  61. have the FULL version, and so I'll leave it up to you to abide by the
  62. above copyright requirements. NIM took almost a week of full-time
  63. programming to get up and running. NIM is my fifth DOOR for the Metro
  64. BBS. Further work will be encouraged by shareware support from those
  65. who use it.
  66.  
  67. Another advantage of registering, is then I'll actually listen to any
  68. suggestions you have for improving the program. Like the Metro BBS,
  69. registered users will be entitled to free updates for life.
  70.  
  71. Owing to the extensive use of ANSI screens created in ANSIMaster,
  72. NIM is by far, Metro's best-looking door, especially when called
  73. by a user who has ANSI graphics and IBM graphics characters available.
  74. All users are catered for, however, and the user can select to receive
  75. the ANSI codes, IBM graphics, both or neither.
  76.  
  77. Anyway, enough of the codswallop.. how do you get this thing to work?
  78.  
  79.  
  80. Archive Contents
  81. ~~~~~~~~~~~~~~~~
  82.  
  83. 'NIM_0-9.lha' should contain these files:
  84.  
  85.   GameImgs.lzh          Archive of all the game images
  86.   door1                 The Door itself. You will need to rename this.
  87.   NIM.about.0.0         The Intro Title
  88.   NIM.about.0.1                 "
  89.   NIM.about.1.0                 "
  90.   NIM.about.1.1                 "
  91.   NIM.bas               The full AmigaBASIC source
  92.   NIM.bye.0.0           The closing message
  93.   NIM.bye.0.1                   "
  94.   NIM.bye.1.0                   "
  95.   NIM.bye.1.1                   "
  96.   NIM.config            Your config file. See later.
  97. * NIM.docs              You're reading them.
  98.   NIM.Errors            Very important. List of errors. See later
  99.   NIM.games             File with all the game details
  100. * NIM.gen.bas           BASIC program to clear the game file if ever needed
  101. * NIM.gen.bas.info      Icon for the same
  102.   NIM.inst.0.0.1        The first instructions screen
  103.   NIM.inst.0.0.2        The second instructions screen
  104.   NIM.inst.0.1.1                "
  105.   NIM.inst.0.1.2                "
  106.   NIM.inst.1.0.1                "
  107.   NIM.inst.1.0.2                "
  108.   NIM.inst.1.1.1                "
  109.   NIM.inst.1.1.2                "
  110.   NIM.lost.0.0          Screen printed should a player lose a game (?)        
  111.   NIM.lost.0.1                  "
  112.   NIM.lost.1.0                  "
  113.   NIM.lost.1.1                  "
  114.   NIM.menu.0.0          NIM's menu
  115.   NIM.menu.0.1                  "
  116.   NIM.menu.1.0                  "
  117.   NIM.menu.1.1                  "
  118.   NIM.won.0.0           Screen printed when a player wins a game (!)
  119.   NIM.won.0.1                   "
  120.   NIM.won.1.0                   "
  121.   NIM.won.1.1                   "
  122.  
  123.  
  124. * = this is not a required file for NIM to run.
  125.  
  126. Setup
  127. ~~~~~
  128. If you've ever setup a door on Metro, I think you'll find it pretty easy:
  129. simply create a new directory in one of your DOORFILES directories called
  130. DOORx (where x is an unused door number), and re-name the file 'Door1' in
  131. the archive to 'DoorX'. Then you have to edit your BBSFILES/DoorCmdsX
  132. file so that a menu entry is created for the door. If this is unclear,
  133. consult the Metro docs themselves.
  134.  
  135. The problem with NIM, is that it accesses nearly 100 files, so it's just
  136. a matter of being careful of where you put things.
  137.  
  138. Within the DOORx directory in DOORFILES, create another directory called
  139. 'GameImgs'. (EG on my system it's BBS:DoorFiles1/Door1/GameImgs') in
  140. this directory, all the game images are stored. This was done to avoid
  141. severely cluttering the Door directory itself. The 'Readme' file in the
  142. archive 'GameImgs.lzh' has further details on this.
  143.  
  144. So we have a directory structure like this:
  145.  
  146. DOORFILESx/DoorX/             (Store all NIM files here)
  147. DOORFILESx/DoorX/GameImgs/    (Store all the Images files here)
  148.                  
  149. The idea is, you unarc 'GameImgs.lzh' into the GameImgs directory,
  150. and then put all the other files in the Door directory itself. Easy,
  151. really, but I'll confuse you and explain it further with an example.
  152.  
  153. Here is the way it's setup on my system. If you have all these files,
  154. the program WILL work: (On my system it's door #1 in doorfiles1... 
  155. yours will definitely be different)
  156.  
  157.  
  158. DOORFILES1/DOOR1/GameImgs/
  159.  
  160.        NIM 1.0.0                        NIM 1.0.1
  161.        NIM 1.1.0                        NIM 1.1.1
  162.        NIM 10.0.0                       NIM 10.0.1
  163.        NIM 10.1.0                       NIM 10.1.1
  164.        NIM 11.0.0                       NIM 11.0.1
  165.        NIM 11.1.0                       NIM 11.1.1
  166.        NIM 12.0.0                       NIM 12.0.1
  167.        NIM 12.1.0                       NIM 12.1.1
  168.        NIM 13.0.0                       NIM 13.0.1
  169.        NIM 13.1.0                       NIM 13.1.1
  170.        NIM 14.0.0                       NIM 14.0.1
  171.        NIM 14.1.0                       NIM 14.1.1
  172.        NIM 15.0.0                       NIM 15.0.1
  173.        NIM 15.1.0                       NIM 15.1.1
  174.        NIM 16.0.0                       NIM 16.0.1
  175.        NIM 16.1.0                       NIM 16.1.1
  176.        NIM 17.0.0                       NIM 17.0.1
  177.        NIM 17.1.0                       NIM 17.1.1
  178.        NIM 2.0.0                        NIM 2.0.1
  179.        NIM 2.1.0                        NIM 2.1.1
  180.        NIM 3.0.0                        NIM 3.0.1
  181.        NIM 3.1.0                        NIM 3.1.1
  182.        NIM 4.0.0                        NIM 4.0.1
  183.        NIM 4.1.0                        NIM 4.1.1
  184.        NIM 5.0.0                        NIM 5.0.1
  185.        NIM 5.1.0                        NIM 5.1.1
  186.        NIM 6.0.0                        NIM 6.0.1
  187.        NIM 6.1.0                        NIM 6.1.1
  188.        NIM 7.0.0                        NIM 7.0.1
  189.        NIM 7.1.0                        NIM 7.1.1
  190.        NIM 8.0.0                        NIM 8.0.1
  191.        NIM 8.1.0                        NIM 8.1.1
  192.        NIM 9.0.0                        NIM 9.0.1
  193.        NIM 9.1.0                        NIM 9.1.1
  194.  
  195. DOORFILES1/DOOR1/
  196.  
  197.        door1                            NIM.about.0.0
  198.        NIM.about.0.1                    NIM.about.1.0
  199.        NIM.about.1.1                    NIM.bye.0.0
  200.        NIM.bye.0.1                      NIM.bye.1.0
  201.        NIM.bye.1.1                      NIM.config
  202.        NIM.Errors                       NIM.games
  203.        NIM.inst.0.0.1                   NIM.inst.0.0.2
  204.        NIM.inst.0.1.1                   NIM.inst.0.1.2
  205.        NIM.inst.1.0.1                   NIM.inst.1.0.2
  206.        NIM.inst.1.1.1                   NIM.inst.1.1.2
  207.        NIM.lost.0.0                     NIM.lost.0.1
  208.        NIM.lost.1.0                     NIM.lost.1.1
  209.        NIM.menu.0.0                     NIM.menu.0.1
  210.        NIM.menu.1.0                     NIM.menu.1.1
  211.        NIM.won.0.0                      NIM.won.0.1
  212.        NIM.won.1.0                      NIM.won.1.1
  213.  
  214.  
  215. The format of the files that are printed out (eg 'NIM.bye.0.1') is simply
  216. to indicate whether the user gets ANSI, IBM Graphics Characters,
  217. neither, or both.
  218.  
  219. eg 'NIM.Lost.1.1' means the player wants ANSI and IBM characters. A '1'
  220. indicates YES, and it's in the order ANSI.IBM. With 'NIM.menu.1.0' this
  221. file contains ANSI, but no high ASCII (IBM graphics) characters. 
  222. 'NIM.about.0.1' has no ANSI but does have IBM graphics. No prizes
  223. for guessing what form 'NIM.bye.0.0' is in.
  224.  
  225. The extra number for the 'NIM.inst.x.y.z' is for the first or second
  226. instructions screen. Anyway, you can read '<file>.0.0' in any
  227. text reader at all, so have a look if you like. 
  228.  
  229. You can use Percy's FILEREAD program (released with v7.0 of Metro)
  230. to have a look at the ANSI screens. I'm sure you'll be quite
  231. pleased when you see what the users with ANSI will actually be seeing.
  232. Local, however, there is no ANSI emulation, and all you get are the
  233. escape codes.
  234.  
  235.  
  236. Generator Program
  237. ~~~~~~~~~~~~~~~~~
  238. I have supplied a blank games file for you, so there is NO NEED to run
  239. the generator to get NIM running. If however, you should happen to
  240. lose your games file (accidentally, hard drive crash, severe program
  241. malfunction (shudder), power turned off or guru halfway through writing
  242. to this file, act of God, or similar disaster), or if you decide you're
  243. completely sick of all the games in progress and want to start again,
  244. then you can run the generator. Simply load up AmigaBASIC and run the
  245. program.
  246.  
  247. When you run it, it will ask you two questions... the first is whether
  248. you actually want to run the generator, the second is where you want the
  249. file it creates put. Then it does its stuff (quite quickly) and produces
  250. a file called 'NIM.Games' which you can use to replace your old copy.
  251.  
  252. I don't really ever imagine you'd have to use this, but you may as well
  253. have a copy of it just in case.
  254.  
  255.  
  256. Config File
  257. ~~~~~~~~~~~
  258.  
  259. Now, so you can set things in the program yourself, NIM has a three
  260. line config file that you can edit with a text editor. Let's look
  261. at the config file in detail:
  262.  
  263. 10
  264. ANYTHING
  265. 20
  266.  
  267.  
  268. That's all there is to it. The first line is how many games each player
  269. can sign up for. Mine is set for 10, but it's too early yet to see how
  270. effective this value will be. NIM has an internal 99 game limit (no more
  271. than 99 games can be current), and if a player tries to start a game when
  272. 99 games are already active, he'll be prevented from doing so.
  273.  
  274. By limiting each player to 10 games, 20 people (at a minimum) can all
  275. be playing NIM. If you have a LOT of users who are really active games
  276. players, you may like to restrict them further than 10.
  277.  
  278. On the other hand, if you run a small BBS, make it 20, 30 or even 50.
  279.  
  280. The second line is the maintenance password. This really doesn't matter,
  281. because you have to have level 9 to get into the maintenance section
  282. anyway! It just gives the hackers something to hack at... they can have
  283. unlimited attempts to get into the maintenance area, but even if they
  284. do manage to get the password right, and their level is less than 9
  285. they get kicked out!
  286.  
  287. I'd suggest you set it to something different to your sysop Metro
  288. Password, however, just in case it confirms to a user what your Metro
  289. password is. This way, even if they do hack into your account, they can
  290. delete all the users and all the files, but they won't be able to touch
  291. the NIM games! In the config, the password can be in upper or lower
  292. case, it doesn't really matter.
  293.  
  294. The final line of the config is how many times a 'Won' game will be
  295. displayed for. When a game has been won, it will be displayed in the
  296. <S>tatus option for a certain number of door entrances. (Every time the
  297. door is run, it will increment the display counter, and if greater than
  298. this value it will reset the game from 'WON' to 'Inactive'). So when 
  299. Harry Bloggs beats Jeff Machinegun in game 17, then these details will
  300. be displayed for all to see, a certain number of times. 
  301.  
  302. This chews up a game slot, so if your users can't start any new games
  303. you can either lower this value, or login and enter and quit from NIM
  304. a dozen times. This will clear games. (The users can do this themselves,
  305. but probably won't - you'll see it in the log if they do!)
  306.  
  307.  
  308. Menu Options
  309. ~~~~~~~~~~~~
  310.  
  311. Right, so NIM is setup and running... how does it work?
  312.  
  313. Firstly have a read of the Menu and the Instructions from within the door
  314. itself. Here are a few more notes on any little intricacies:
  315.  
  316. <P>lay, <J>oin, <B>egin, <I>nstructions, <A>bout and <Q>uit are pretty
  317. obvious, so I won't mention them here.
  318.  
  319. <S>tatus goes through the games file and prints up relevant details on
  320. each active game. An active game is either waiting for someone to
  321. join up (only 1 player involved), in progress (meaning that it's
  322. waiting for one of the players to take their turn), or has been WON, in
  323. which case it will be displayed for a certain amount of times (see above).
  324.  
  325. If YOU are looking at the overall status (very fast locally) what
  326. you should be looking for are the 'Last Move' dates. If a game has been
  327. waiting on a certain player for 6 weeks, then I'd say it's time to
  328. reset that game in maintenance (see later).
  329.  
  330. <Y>our Status is the same as above, but only the games that YOU are
  331. involved in.
  332.  
  333. <V>iew a game prints up any game you like (as long as you know the
  334. game number - see the <S>tatus to find out) as if you were about to play
  335. it. Thus it gives my GameImgs a bit more use than in the game itself.
  336. It's also handy to see how you're going if it's not your turn to play
  337. yet.
  338.  
  339. <C>hange your setup asks you the same questions that you were asked
  340. on entry, that is, do you want ANSI and do you want IBM graphics
  341. characters. Locally, you WON'T want ANSI, the BASIC screen will simply
  342. display all the escape codes and distort the display somewhat.
  343. Remote it will look VERY good (I hope - still waiting to have a look
  344. at this one using a good ansi terminal).
  345.  
  346. If you are still using the Topaz font, you also won't want IBM graphics
  347. characters. But gee, are there any Metro sysops who do use Topaz anywhere?
  348. If you are such a person, go and change your startup-sequence immediately
  349. and use FF (from Workbench 1.3) to globally replace Topaz with the IBM
  350. font. The command is 'FF >NIL: IBM.font" (Of course you must have the
  351. IBM font in your fonts: directory firstly). The '>NIL:' bit is optional.
  352. You could use 'FF IBM.font' as well, if you like.
  353.  
  354. Ever since v7.0 of Metro came out I've been running the IBM font instead
  355. of Topaz. I can tell you, it's a big improvement!! Much more readable.
  356. When you use FF to change the fonts, IBM font 'becomes' topaz to the
  357. amiga. All your applications, wordprocessors, databases, Metro, Metro
  358. doors - the works - will all look heaps better.
  359.  
  360. And you'll be able to see all the IBM graphics characters that this
  361. door uses from within a BASIC program!
  362.  
  363. The way the screen clearing works will speedup too... there are two
  364. methods I use. If you don't want ANSI or the IBM font, a screen is
  365. cleared by printing up 24 blank lines. By answering 'yes' to just
  366. one of those questions the screen will clear with a crtl-L (remote) and
  367. a CLS function locally. This latter method is HEAPS faster.
  368.  
  369. <M>aintenance is the section you should be interested in. It merely allows
  370. you to delete any game and reset all the good bits back to zero.
  371. From the <S>tatus option you can keep an eye on the games, and note if
  372. any player has obviously signed up for a game never to return. Jot the
  373. game numbers down on one of those scraps of paper idling around near the
  374. computer and enter maintenance.
  375.  
  376. You will need to know the maintenance password (read NIM.config if you
  377. forget) AND have level 9 security to get into this section. It's
  378. pretty simple: you type in the number of the game you wish to
  379. delete, and the program will tell you who's playing and the date of
  380. the last move. It will not check the game, so it's possible to reset
  381. inactive games (not that this makes much difference!! Maintenance
  382. converts them to inactive ANYWAY!!!). You have to be able to delete any
  383. sort of game (1 player, active, displaying, etc) so there's no point
  384. testing them! If a game is inactive I think the date of the last go will
  385. read 'Never', anyway, so it's going to be easy to see.
  386.  
  387. The program then asks you whether you're sure you want to re-set
  388. the game. Tell it you are. (HotKeyed) Then (just to make sure) it
  389. asks you again! If you decide after humble consideration of the matter
  390. that you do wish to proceed, then that game will be erased forever
  391. from the NIM records, and it will provide a free slot for new games
  392. to start in. It will also release players from any games they may be
  393. involved in, but can't play (because their opponent has left the
  394. country, become bankrupt and no longer owns a computer, etc, etc).
  395.  
  396.  
  397. Errors
  398. ~~~~~~
  399. It is absolutely CRITICAL you have a file called 'NIM.errors' in the
  400. directory, otherwise if an error in the program does occur (thus
  401. the error checking is suspended) NIM will hang, and put your BBS
  402. offline.
  403.  
  404. It doesn't matter what the file 'NIM.errors' looks like, as long
  405. as it actually exists, so NIM can append its error messages to
  406. it.
  407.  
  408. The way it works now, NIM checks for two sorts of error: FileNotFound
  409. and all the others. I couldn't work out what sort of other error WOULD
  410. occur, but anyway, if one does occur, the program will record the error
  411. in this error file for you (along with the line number and time and
  412. date it occured) and abort the program. The users will simply be told
  413. that this has happened.
  414.  
  415. If any of these other errors should occur, I want to know about them.
  416. Let me know exactly what the entry says, and I'll investigate the
  417. matter and remove the bug. I don't think you'll get any of these.
  418. In any case, you can look the errors up in your AmigaBASIC manual
  419. and poke fun at how badly I've goofed!
  420.  
  421. If a file NIM needs to access is not in the right directory, or
  422. has been misnamed or whatever, NIM will write to the errors file
  423. the time and date of the event, and also the EXACT NAME OF THE FILE
  424. THAT NIM WAS TRYING TO ACCESS. You should then check this errors file
  425. to find out the filename, and then scan your drive to see where you've
  426. hidden it. The files can only be in two places... the door directory,
  427. or in the GameImgs directory inside the door directory. There should
  428. be 68 files in GameImgs. Make sure they are there.
  429.  
  430. Anyway, if you have the directory setup correctly, this second error
  431. will not occur, either. If any error does occur however (apart from
  432. not having a 'NIM.errors' in the door directory) NIM will never hang
  433. the system. It will at worst, simply quit the user back to the BBS.
  434.  
  435.  
  436. Brief Miscellaneous Notes
  437. ~~~~~~~~~~~~~~~~~~~~~~~~~
  438. The program allows for user numbers between 1 and 9,999. (I was nearly
  439. going to make it 999, but I know Percy is nearly up to 1000 users
  440. now. If you have more than 10,000 users on your BBS, users who play NIM
  441. will only have the leftmost 4 digits taken into account.. EG user number
  442. 12,345 will look exactly the same to NIM as user # 1234. Of course,
  443. the chances of the same player playing each others games with this many
  444. users is downright minimal.
  445.  
  446. Anyway, if you do have more than 10,000 users on your system I'll do
  447. you a custom version of NIM. Better add a few more games than 99 in the
  448. process, too! :-)
  449.  
  450. When playing NIM and coming down to the wire, remember the object of
  451. the game is to *NOT* take the last piece. So, if a user has 2 objects
  452. left, and removes 3, I don't go telling him: "Hey, there's only 2
  453. pieces left." I interpret this as him taking the LAST remaining piece
  454. and thus LOSING the game. (He'd lose of he also removed 2 objects!)
  455.  
  456. Also, the game never goes to its logical conclusion of the loser having
  457. to remove the last piece. The game is won when there is only 1 piece
  458. remaining. (Otherwise the potential loser would simply never play
  459. that particular game again and forever postpone the inevitable). In fact,
  460. despite me having made up images for 1 piece left, from the looks of the
  461. program, they'll NEVER be displayed. Ah well!
  462.  
  463.  
  464. Ravings
  465. ~~~~~~~
  466. Well, that's just about it, I'd say. I shouldn't go on further, as I'm
  467. going to be uploading this to USA, and the longer the more expensive!
  468.  
  469. I was extremely pleased at how well LHARC crunched all the images files,
  470. menus, etc. I was almost going to send this over on disk, but it
  471. won't be too long an upload as it is. I double-arced 'GameImgs' not
  472. for the saving in size, but to make sure you unarc it into its own 
  473. directory within the door directory. All the other files can go
  474. in the door directory itself if you like.
  475.  
  476. I only wish I could call my system now and see what NIM looks like
  477. in ANSI... the ansi files were all done with a program called
  478. 'ANSI Master' which is on Fish Disk # 378. I suggest you get this one.
  479. It's written in Hi-Soft Basic (sound familiar, no?) and is good for
  480. doing the IBM graphics characters. DIED V2.4 is still very good, and
  481. has more options, but no way of accessing the high ASCII, except by
  482. trial and error through the Alt-keys. AnsiMaster has a set of gadgets
  483. you can click on.
  484.  
  485. Be warned, however, ANSImaster saves your files with CR+LF, so you need
  486. to strip out the Ctrl-Ms with something like Repstring for them to be
  487. true amiga files (with just the linefeeds).
  488.  
  489. I also touched the files up with Cygnus Ed Pro as well as stripping the
  490. ctrl-Ms from them. BTW Cygnus Ed Pro EATS any other editor you care to
  491. name. It's brilliant, and SO FAST!!!!! A lot of the time I do the BASIC
  492. code in Cygnus and then load it into BASIC for the odd touch up.
  493.  
  494. It took me about a week to write this program, and I kept on getting
  495. distracted during its development (things like work, etc). It took
  496. as long to do all the graphics files as the actual coding.
  497.  
  498. It was mainly written as a learning experiment in handling multi-player
  499. operations and BASIC random files... see, I've only been programming for
  500. less than 2 months. Eventually I hope to get 'Global Wars' ported to the
  501. Metro BBS, but I may end up buying GFA BASIC first and try out Percy's
  502. new ANSI door-routines. With this game, the file operations slowed me
  503. down. With Global, I hope the file operations are now all there, and the
  504. actual GAME coding will slow me down.
  505.  
  506. Anyway, Metro now has another door, and you'll all have to think
  507. about putting TWO door directories online now, if you haven't already 
  508. done so.
  509.  
  510. Finally, may I severely apologise for the room this door will take up
  511. on your hard drive. It worked out at over 1/4 meg on mine. Hopefully
  512. no re-partitioning will be called for to let it fit! See, when a file is
  513. stored on the Amiga, it always takes up a multiple of the block size.
  514. If you have a hard drive formatted under the FFS, the block size will be
  515. 512 bytes. So, if a file is 1023 bytes it will take up 1024 bytes of
  516. drivespace. If you have a file that's 1025 bytes long, that will take
  517. up 1566 bytes on the drive.  :-(
  518.  
  519.  
  520.  
  521.                -Peter!
  522.  
  523.